package com.kelab.dify.exception;

/**
 * Dify API异常基类
 * 
 * @author kelab
 * @version 1.0
 */
public class DifyException extends Exception {
    
    private final int statusCode;
    private final String errorCode;
    private final String errorMessage;
    
    /**
     * 构造函数
     * 
     * @param message 异常消息
     */
    public DifyException(String message) {
        super(message);
        this.statusCode = -1;
        this.errorCode = null;
        this.errorMessage = message;
    }
    
    /**
     * 构造函数
     * 
     * @param message 异常消息
     * @param cause 原因异常
     */
    public DifyException(String message, Throwable cause) {
        super(message, cause);
        this.statusCode = -1;
        this.errorCode = null;
        this.errorMessage = message;
    }
    
    /**
     * 构造函数
     * 
     * @param statusCode HTTP状态码
     * @param errorCode 错误代码
     * @param errorMessage 错误消息
     */
    public DifyException(int statusCode, String errorCode, String errorMessage) {
        super(String.format("HTTP %d: %s - %s", statusCode, errorCode, errorMessage));
        this.statusCode = statusCode;
        this.errorCode = errorCode;
        this.errorMessage = errorMessage;
    }
    
    /**
     * 构造函数
     * 
     * @param statusCode HTTP状态码
     * @param errorCode 错误代码
     * @param errorMessage 错误消息
     * @param cause 原因异常
     */
    public DifyException(int statusCode, String errorCode, String errorMessage, Throwable cause) {
        super(String.format("HTTP %d: %s - %s", statusCode, errorCode, errorMessage), cause);
        this.statusCode = statusCode;
        this.errorCode = errorCode;
        this.errorMessage = errorMessage;
    }
    
    /**
     * 获取HTTP状态码
     * 
     * @return HTTP状态码
     */
    public int getStatusCode() {
        return statusCode;
    }
    
    /**
     * 获取错误代码
     * 
     * @return 错误代码
     */
    public String getErrorCode() {
        return errorCode;
    }
    
    /**
     * 获取错误消息
     * 
     * @return 错误消息
     */
    public String getErrorMessage() {
        return errorMessage;
    }
    
    /**
     * 判断是否为HTTP错误
     * 
     * @return 如果是HTTP错误返回true
     */
    public boolean isHttpError() {
        return statusCode > 0;
    }
    
    /**
     * 判断是否为客户端错误（4xx）
     * 
     * @return 如果是客户端错误返回true
     */
    public boolean isClientError() {
        return statusCode >= 400 && statusCode < 500;
    }
    
    /**
     * 判断是否为服务器错误（5xx）
     * 
     * @return 如果是服务器错误返回true
     */
    public boolean isServerError() {
        return statusCode >= 500 && statusCode < 600;
    }
}